#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
系统诊断脚本
用于检测和修复YOLO应用启动问题
"""

import os
import sys
import logging
import traceback
import importlib
import threading
import time

# 配置日志
logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    handlers=[
        logging.FileHandler("diagnostics.log"),
        logging.StreamHandler()
    ]
)
logger = logging.getLogger('diagnostics')

def test_api_server_standalone():
    """单独测试API服务器模块"""
    logger.info("开始测试API服务器模块...")
    try:
        # 尝试导入API服务器模块
        from api.api_server import get_api_server, ApiServer
        logger.info("成功导入API服务器模块")
        
        # 测试单例模式
        server1 = get_api_server()
        server2 = get_api_server()
        logger.info(f"单例模式测试: {server1 is server2}")
        
        # 测试服务器配置
        logger.info(f"服务器配置 - 主机: {server1.host}, 端口: {server1.port}")
        
        # 启动服务器5秒然后停止
        logger.info("启动API服务器...")
        success = server1.start()
        logger.info(f"API服务器启动结果: {success}")
        
        if success:
            logger.info("API服务器已启动，等待5秒后停止")
            time.sleep(5)
            logger.info("停止API服务器...")
            server1.stop()
        
        return True
    except Exception as e:
        logger.error(f"API服务器测试失败: {str(e)}")
        logger.error(f"详细错误堆栈: {traceback.format_exc()}")
        return False

def test_main_app_imports():
    """测试main_app.py的导入"""
    logger.info("开始测试main_app.py导入...")
    try:
        # 尝试导入main_app模块
        import main_app
        logger.info("成功导入main_app模块")
        
        # 检查main_app中的关键组件
        if hasattr(main_app, 'YOLOApplySystem'):
            logger.info("找到YOLOApplySystem类")
            system = main_app.YOLOApplySystem()
            logger.info("成功创建YOLOApplySystem实例")
            return True
        else:
            logger.error("在main_app中未找到YOLOApplySystem类")
            return False
    except Exception as e:
        logger.error(f"main_app导入测试失败: {str(e)}")
        logger.error(f"详细错误堆栈: {traceback.format_exc()}")
        return False

def test_api_integration():
    """测试API服务器与系统的集成"""
    logger.info("开始测试API服务器集成...")
    try:
        # 导入main_app
        import main_app
        
        # 创建系统实例
        system = main_app.YOLOApplySystem()
        
        # 只加载配置和初始化必要组件
        if system.load_config():
            logger.info("配置加载成功")
        else:
            logger.warning("配置加载失败，但继续测试")
        
        # 直接测试API服务器启动
        logger.info("直接调用start_api_server方法...")
        success = system.start_api_server()
        logger.info(f"API服务器启动结果: {success}")
        
        if success:
            logger.info("API服务器已启动，等待10秒后停止")
            time.sleep(10)
            logger.info("测试完成，准备清理")
        
        return success
    except Exception as e:
        logger.error(f"API集成测试失败: {str(e)}")
        logger.error(f"详细错误堆栈: {traceback.format_exc()}")
        return False

def fix_main_app():
    """尝试修复main_app.py文件"""
    logger.info("开始修复main_app.py文件...")
    try:
        main_app_path = "d:\\未知\\yolo_apply\\main_app.py"
        
        # 读取当前文件内容
        with open(main_app_path, 'r', encoding='utf-8') as f:
            content = f.read()
        
        # 检查文件是否包含重复的代码段
        if "# -*- coding: utf-8 -*-" in content and content.count("# -*- coding: utf-8 -") > 1:
            logger.warning("检测到文件可能包含重复的编码声明")
            
            # 找到第一个编码声明之后的内容
            first_encoding_idx = content.find("# -*- coding: utf-8 -*-")
            second_encoding_idx = content.find("# -*- coding: utf-8 -*-", first_encoding_idx + 1)
            
            if second_encoding_idx > 0:
                logger.info("修复文件结构，移除重复部分")
                # 保留第一个编码声明之前的内容
                fixed_content = content[:second_encoding_idx]
                
                # 备份原始文件
                backup_path = main_app_path + ".backup"
                with open(backup_path, 'w', encoding='utf-8') as f:
                    f.write(content)
                logger.info(f"已备份原始文件到 {backup_path}")
                
                # 写回修复后的内容
                with open(main_app_path, 'w', encoding='utf-8') as f:
                    f.write(fixed_content)
                logger.info("main_app.py文件修复完成")
                return True
        else:
            logger.info("文件结构看起来正常，不需要修复")
            return True
    except Exception as e:
        logger.error(f"修复main_app.py失败: {str(e)}")
        logger.error(f"详细错误堆栈: {traceback.format_exc()}")
        return False

def main():
    """主诊断函数"""
    logger.info("开始系统诊断...")
    
    # 修复main_app.py文件
    fix_main_app()
    
    # 测试API服务器独立运行
    api_standalone_ok = test_api_server_standalone()
    
    # 测试main_app导入
    main_app_import_ok = test_main_app_imports()
    
    # 如果前两步成功，测试API集成
    api_integration_ok = False
    if api_standalone_ok and main_app_import_ok:
        api_integration_ok = test_api_integration()
    
    # 显示诊断结果
    logger.info("======== 诊断结果 ========")
    logger.info(f"API服务器独立测试: {'通过' if api_standalone_ok else '失败'}")
    logger.info(f"main_app导入测试: {'通过' if main_app_import_ok else '失败'}")
    logger.info(f"API集成测试: {'通过' if api_integration_ok else '未执行或失败'}")
    
    if api_standalone_ok and main_app_import_ok and api_integration_ok:
        logger.info("✅ 所有测试通过！系统应该可以正常启动")
    else:
        logger.warning("❌ 部分测试失败，请查看日志获取详细信息")

if __name__ == "__main__":
    main()